﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Threading;
using System.IO;

namespace OscuridadDeCaracteres
{
    class Program
    {
        static char [] paleta = new char [32];
        static string spaleta32 = "  ``..,,_{|?\"+1C&$YnDSkRE@@H#NMM";
        //static string spaleta32 = "                 MMMMMMMMMMMMMMMM";
        //static string spaleta64 = ".'`^\",:;Il!i><~+_-?][}{1)(|\\/tfjrxnuvczXYUJCLQ0OZmwqpdbkhao*#MW&";
        //static string spaleta32 = "MMN#H@@ERkSDnY$&C1+\"?|{_,,..``  ";
        //static string spaleta64 = "&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\\|()1{}[]?-_+~<>i!lI;:,\"^`'.";
        
        static void Main (string [] args)
        {
            for(;;)
            foreach (string sFile in Directory.GetFiles(".\\pics", "*.png"))
            {
                Bitmap bmp = (Bitmap)Bitmap.FromFile(sFile);
                string sss = Imgchar.bmpToString(bmp, spaleta32);
                Console.WriteLine(sss);
                bmp.Dispose();
                Console.SetCursorPosition(0, 0);
                Thread.Sleep(100);
            }

            string repr = string.Empty;

            //foreach (char c in imprimibles())
            //{
            //    dameBrillo(c, ref repr);
            //    Console.WriteLine(repr);
            //    Console.SetCursorPosition(0, 0);
            //}
            //Console.SetCursorPosition (0, 16);

            var pcos = new List<ParCharOscuridad>();

            // construyo pares caracter oscuridad con los caracteres ascii imprimibles
            foreach (char c in imprimibles()) {                
                int brillo = dameBrillo(c, ref repr);
                pcos.Add( new ParCharOscuridad(c, brillo));
            }

            // ordeno los pares "caracter / oscuridad"
            pcos.Sort ((pco1, pco2) => pco1.brillo.CompareTo (pco2.brillo));

            // empiezo a llenar la paleta
            foreach (ParCharOscuridad pco in pcos)
                if (paleta[pco.brillo] == '\0')
                    paleta[pco.brillo] = pco.c;
            
            // relleno huecos en la paleta (se que el primer elemento es espacio = " ")
            char efectivo = '\0';
            for (int i = 0; i < 32; i ++)
            {
                if (paleta[i] == '\0')
                    paleta[i] = efectivo;
                else
                    efectivo = paleta[i];
            }

            // muestro la paleta
            for (int i = 32; i < 0; i++)
                Console.WriteLine("{0} {1}", paleta[i], i);

            Console.ReadLine ();
        }

        static IEnumerable<char> imprimibles()
        {
            for (int i = 0x20; i <= 0x7E; i ++)
            //for (int i = 0x20; i <= 255; i++)
                yield return (char) i;
        }

        static int dameBrillo (char c, ref string repr)
        {
            Bitmap      b = new Bitmap (16, 16);
            Graphics    g = Graphics.FromImage (b);

            g.FillRectangle (
                new SolidBrush(Color.White), 
                0, 0, 16, 16
            );

            g.DrawString (
                c.ToString(),
                new Font("Courier New", 10),
                new SolidBrush(Color.Black),
                0f, 0f
            );

            int ret = 0;
            StringBuilder sb = new StringBuilder(512);

            for (int j = 0; j < 16; j++) {
                for (int i = 0; i < 16; i++) {
                    if (b.GetPixel(i, j).R == 255)
                    {
                        sb.Append(" ");
                    }
                    else
                    {
                        sb.Append("M");
                        ret++;
                    }
                }
                sb.AppendLine();
            }

            repr = sb.ToString();
            return ret;
        }
    }
}
